package com.fafu.service.Impl;

import com.fafu.dao.UserDao;
import com.fafu.domian.user.User;
import com.fafu.service.UserService;
import com.fafu.tool.*;
import org.mindrot.jbcrypt.BCrypt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Service("userService")
public class UserServiceImpl implements UserService {
	@Autowired
	private UserDao userDao;
	private boolean flag;



	/**
	 * 注册用户
	 * @param user
	 * @throws Exception
	 */
	@Override
	public boolean register(User user) throws Exception {
		//1.判断用户名是否重复
		User u = userDao.findByUsername(user.getUsername());
		//用户名存在，注册失败
		if ( u != null){
			return false;
		}
		//2.保存用户信息
		//设置激活码，唯一字符串
		user.setCode(BCrypt.gensalt());
		//设置激活状态，初始默认位N
		user.setStatus("N");
		//BCrypt密码加密
		user.setPassword(BCryptUtils.setCode(user.getPassword()));
		//设置用户注册日期
		user.setCreatedate(DateUtils.getdate(new Date()));
		//信息保存
		userDao.save(user);
		//3.激活邮件发送
		String content = "<a href='http://101.133.141.41/User/user/active?code="+user.getCode()+"'>点击激活【点滴农大】</a>";
		new MailUtils587().sendEmail("激活点滴农大",content,user.getUsername());
		return true;
	}
	/**
	 * 激活用户
	 * @param code
	 * @return
	 */
	@Override
	public boolean active(String code) {
		//1.根据激活码查询用户对象
		User u = userDao.findByCode(code);
		//查找到对象
		if(u != null){
			//2.调用dao的修改激活状态的方法
			userDao.updateStatus(u);
			return  true;
		}else {
			return false;
		}
	}

	/**
	 * 登陆方法
	 * @param user
	 * @return
	 */
	@Override
	public User login(User user) {
		//取出同名用户信息
	 	User u = userDao.findByUsername(user.getUsername());
	 	//比较输入密码和数据库中的加密密码
		flag = BCrypt.checkpw(user.getPassword(), u.getPassword());
		if (flag) {
			//比对真确，返回用户信息
			return userDao.findByUsername(user.getUsername());
		} else {
			return null;
		}
	}
	/**
	 * 查找所有用户
	 */
	public List <User> findAll(){
		return  userDao.findAll();
	}

	/**
	 * 修改密码（验证token版）
	 */
	@Override
	public boolean update(String token, String username,String password) {
		//1.发送请求验证token
		Map map = TokenUtil.checkToken(token);
		//2.判断请求
		//先验证TOKEN
		if( (boolean) map.get("flag")){
			//验证TOKEN中的用户信息和当前用户信息
			if(map.get("username").equals(username)){
				//查询出账户信息
				User u = userDao.findByUsername(username);
				//先加密，再设置密码
				u.setPassword(BCryptUtils.setCode(password));
				//5.更新密码
				userDao.updatePassword(u);
				return  true;
			}else {
				return false;
			}
		}else {
			return false;
		}
	}

	/**
	 * 忘记密码
	 * @param username
	 */
	@Override
	public void forget(String username) {
		/*
		手机端重置密码（暂不使用）
		//1.生成重置码
		String code = ResetUtils.getRestCode();
		//.发邮件获取重置码
		MailUtils587.sendEmail("重置密码",code,username);
		//2.重置码加密写入数据库
		userDao.updateCode(username,BCryptUtils.setCode(code));
		 */
		User u = userDao.findByUsername(username);
		//用户还未注册，不需要发邮件
		if(u == null){
			return;
		}
		String content = "<a href='http://101.133.141.41/User/user/updatepassword?code="+u.getCode()+"&username="+username+"'>【点滴农大】点击修改密码</a>";
		new MailUtils587().sendEmail("重置密码",content,username);
	}

	/**
	 * 验证重置码，并登录
	 * 使用前提用户名必须存在，且注册并且持有BCrypt加密过的code
	 * 否则空指针异常 或者报错
	 */
	@Override
	public User reset(String username, String code) {
		//对比输入的重置码和数据库存入的
		flag = BCrypt.checkpw(code,userDao.findByUsername(username).getCode());
		if(flag){
			//返回用户信息
			//修改重置码(防止复用)
			userDao.updateCode(username,BCrypt.gensalt());
			return userDao.findByUsername(username);
		}else {
			//返回用户信息(null)
			return null;
		}
	}

	/**
	 *  检查激活状态
	 *   激活状态（Y/N)
	 */
	public boolean checkstatus(String username){
		//若状态为Y则激活
		if(userDao.findByUsername(username).getStatus().equals("Y")){
			return true;
		}
		//未激活
		return false;
	}
	/**
	 * 重新发送邮件
	 */
	public void resend(String username){
		User u = userDao.findByUsername(username);
		String content = "<a href='http://101.133.141.41/User/user/active?code="+u.getCode()+"'>点击激活【点滴农大】</a>";
		new MailUtils587().sendEmail("激活点滴农大",content,username);
	}

	/**
	 * 修改密码（无token版）
	 * 有待改进
	 * 还未写判断失败成功
	 */
	public boolean updatebyweb(String username,String code , String password){
		//查询出账户信息
		User u = userDao.findByCode(code);
		if(u.getUsername().equals(username)){
			//先加密，再设置密码
			u.setPassword(BCryptUtils.setCode(password));
			//5.更新密码
			userDao.updatePassword(u);
			return true;
		}
		return false;
	}
	/**
	 * 修改密码共用部分
	 */
	/**
	 * 修改重置码(防止复用)
	 * @param username
	 * @param code
	 */
	/*@Override
	public void update(String username, String code) {
		//修改code
		userDao.updateCode(username,code);
	}*/

}
